forked from
npmx.dev/npmx.dev
[READ-ONLY]
a fast, modern browser for the npm registry
1import { CACHE_MAX_AGE_ONE_HOUR, ERROR_NPM_FETCH_FAILED } from '#shared/utils/constants'
2import { resolvePackageReadmeSource } from '#server/utils/readme-loaders'
3
4/**
5 * Returns rendered README HTML for a package.
6 *
7 * URL patterns:
8 * - /api/registry/readme/packageName - latest version
9 * - /api/registry/readme/packageName/v/1.2.3 - specific version
10 * - /api/registry/readme/@scope/packageName - scoped package, latest
11 * - /api/registry/readme/@scope/packageName/v/1.2.3 - scoped package, specific version
12 */
13export default defineCachedEventHandler(
14 async event => {
15 try {
16 const packagePath = getRouterParam(event, 'pkg') ?? ''
17 const { packageName, markdown, repoInfo } = await resolvePackageReadmeSource(packagePath)
18
19 if (!markdown) {
20 return { html: '', mdExists: false, playgroundLinks: [], toc: [] }
21 }
22
23 return await renderReadmeHtml(markdown, packageName, repoInfo)
24 } catch (error: unknown) {
25 handleApiError(error, {
26 statusCode: 502,
27 message: ERROR_NPM_FETCH_FAILED,
28 })
29 }
30 },
31 {
32 maxAge: CACHE_MAX_AGE_ONE_HOUR,
33 swr: true,
34 getKey: event => {
35 const pkg = getRouterParam(event, 'pkg') ?? ''
36 return `readme:v8:${pkg.replace(/\/+$/, '').trim()}`
37 },
38 },
39)